/**
 * 表情包推荐器
 * 
 * 根据情感类型推荐合适的表情包
 * Requirements: 3.1, 3.2, 3.3, 3.4
 */

import type { Emoji, EmojiRecommendation, EmotionalTone } from '../types';
import {
  getEmojisByCategory,
  searchEmojis,
  getAllEmojis,
  ALL_EMOTIONAL_TONES,
} from './EmojiDatabase';

/**
 * 默认推荐数量
 */
const DEFAULT_RECOMMEND_COUNT = 3;

/**
 * 默认情感类型（用于无匹配时的回退）
 */
const DEFAULT_EMOTIONAL_TONE: EmotionalTone = 'neutral';

/**
 * 表情包推荐器接口
 */
export interface IEmojiRecommender {
  /**
   * 根据情感类型推荐表情包
   * @param tone 情感类型
   * @param count 推荐数量（默认3个）
   * @returns 表情包推荐结果
   */
  recommend(tone: EmotionalTone, count?: number): EmojiRecommendation;

  /**
   * 搜索表情包
   * @param query 搜索关键词
   * @returns 匹配的表情包列表
   */
  search(query: string): Emoji[];

  /**
   * 获取默认表情包推荐
   * @returns 默认表情包推荐结果
   */
  getDefault(): EmojiRecommendation;
}

/**
 * 表情包推荐器实现类
 */
export class EmojiRecommender implements IEmojiRecommender {
  /**
   * 根据情感类型推荐表情包
   * 
   * Requirements:
   * - 3.1: 推荐至少3个相关表情包
   * - 3.2: 根据情感类型进行分类
   * - 3.3: 优先推荐指定类型的表情包
   * - 3.4: 无匹配时返回通用表情包
   * 
   * @param tone 情感类型
   * @param count 推荐数量（默认3个，最少3个）
   * @returns 表情包推荐结果
   */
  recommend(tone: EmotionalTone, count: number = DEFAULT_RECOMMEND_COUNT): EmojiRecommendation {
    // 确保至少推荐3个表情包 (Requirements 3.1)
    const actualCount = Math.max(count, DEFAULT_RECOMMEND_COUNT);
    
    // 获取指定情感类型的表情包 (Requirements 3.2, 3.3)
    const categoryEmojis = getEmojisByCategory(tone);
    
    // 如果该类型有足够的表情包，直接返回
    if (categoryEmojis.length >= actualCount) {
      return {
        emojis: this.shuffleAndTake(categoryEmojis, actualCount),
        category: tone,
        isDefault: false,
      };
    }
    
    // 如果该类型表情包不足，补充其他类型的表情包
    if (categoryEmojis.length > 0) {
      const remaining = actualCount - categoryEmojis.length;
      const otherEmojis = this.getOtherCategoryEmojis(tone, remaining);
      return {
        emojis: [...categoryEmojis, ...otherEmojis],
        category: tone,
        isDefault: false,
      };
    }
    
    // 如果该类型没有表情包，返回默认推荐 (Requirements 3.4)
    return this.getDefault();
  }

  /**
   * 搜索表情包
   * 
   * @param query 搜索关键词
   * @returns 匹配的表情包列表
   */
  search(query: string): Emoji[] {
    if (!query || query.trim() === '') {
      return [];
    }
    return searchEmojis(query.trim());
  }

  /**
   * 获取默认表情包推荐
   * 
   * Requirements 3.4: 无匹配时返回通用表情包并提示用户
   * 
   * @returns 默认表情包推荐结果（标记 isDefault: true）
   */
  getDefault(): EmojiRecommendation {
    const neutralEmojis = getEmojisByCategory(DEFAULT_EMOTIONAL_TONE);
    
    // 如果中性类型有足够表情包
    if (neutralEmojis.length >= DEFAULT_RECOMMEND_COUNT) {
      return {
        emojis: this.shuffleAndTake(neutralEmojis, DEFAULT_RECOMMEND_COUNT),
        category: DEFAULT_EMOTIONAL_TONE,
        isDefault: true,
      };
    }
    
    // 否则从所有表情包中随机选择
    const allEmojis = getAllEmojis();
    return {
      emojis: this.shuffleAndTake(allEmojis, DEFAULT_RECOMMEND_COUNT),
      category: DEFAULT_EMOTIONAL_TONE,
      isDefault: true,
    };
  }

  /**
   * 从其他情感类型获取补充表情包
   */
  private getOtherCategoryEmojis(excludeTone: EmotionalTone, count: number): Emoji[] {
    const otherEmojis: Emoji[] = [];
    
    for (const tone of ALL_EMOTIONAL_TONES) {
      if (tone !== excludeTone) {
        const emojis = getEmojisByCategory(tone);
        otherEmojis.push(...emojis);
      }
    }
    
    return this.shuffleAndTake(otherEmojis, count);
  }

  /**
   * 随机打乱数组并取前N个元素
   */
  private shuffleAndTake<T>(array: T[], count: number): T[] {
    const shuffled = [...array].sort(() => Math.random() - 0.5);
    return shuffled.slice(0, count);
  }
}

/**
 * 默认表情包推荐器实例
 */
export const emojiRecommender = new EmojiRecommender();
